package portal.servicios;

import java.rmi.RemoteException;
import java.util.Date;
import java.util.concurrent.TimeoutException;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;

import org.jboss.logging.Logger;

import portal.entidades.Compra;
import portal.entidades.Configuracion;
import portal.entidades.MonitoreoLog;
import portal.entidades.Resultado;
import portal.util.config.ConfigUtil;
import portal.util.string.StringUtil;
import portal.util.xml.XmlUtil;
import portal.webservices.monitoreo.IllegalXMLException_Exception;
import portal.webservices.monitoreo.WSMonitoreo;
import portal.webservices.monitoreo.WSMonitoreoService;

@Stateless
@LocalBean
public class NotificacionAuditoriaServiceBean implements NotificacionAuditoriaService {

	@EJB
	private ConfigurationService adminConfig;
	
	@EJB
	private InformarAsincronico informarAsincronico;
	
	private static Logger logger = Logger.getLogger(NotificacionAuditoriaServiceBean.class);

	private final String ES_SINCRONICO = "monitoreo_sincronico";
	private final String CONF_WS = "monitoreo_ws_endpoint";
	private final String CONF_COLA_QUEUE = "monitoreo_cola_queue";
	private final String CONF_COLA_CONNETION = "monitoreo_cola_connection";

	public NotificacionAuditoriaServiceBean() {

	}

	public Resultado enviarInformeAuditoria(String moduloId, String fecha, String mensaje) throws RemoteException {

		Resultado resultado = new Resultado();
		MonitoreoLog log = new MonitoreoLog(fecha, moduloId, mensaje);
		logger.info("######## enviarInformeAuditoria START ########");

		try {
			// Obtengo de la configuracion si es sincronico
			Configuracion tipoConfiguracion = adminConfig.buscarPorTipo(ES_SINCRONICO);
			Boolean esSincronico = StringUtil.null2Boolean(tipoConfiguracion.getValor());

			// Verifico si es sincronico
			logger.info("Es notificacion sincronica: " + esSincronico);
			if (esSincronico) {
				// Obtengo configuracion de WS
				Configuracion configuracion = adminConfig.buscarPorTipo(CONF_WS);
				// Invoco servicio
				String res = InformarSincronicoLyM.informarLog(log, configuracion);
				logger.info("Recibo respuesta " + res);
				resultado = XmlUtil.responseXml2Resultado(res);

				// Verifico error
				if (resultado.isError())
					resultado.setErrorConMensaje("Hubo un error en el envio del informa a auditoria");
				else
					resultado.setOkConMensaje("Se envio el informe a auditoria con exito");

			} else {
				// Obtengo configuracion de WS
				Configuracion confConexion = adminConfig.buscarPorTipo(CONF_COLA_CONNETION);
				Configuracion confCola = adminConfig.buscarPorTipo(CONF_COLA_QUEUE);
				// Invoco servicio
				informarAsincronico.informarLog(log, confConexion.getValor(), confCola.getValor());
				resultado.setOkConMensaje("Se envio la informacion a Logistica y Monitoreo");
			}
		} catch (TimeoutException e) {
			e.printStackTrace();
			resultado.setErrorConMensaje("Ocurrio un error inesperado : Logistica y Monitoreo no respondio.");
			logger.error(resultado.getMensaje(), e);
		} catch (Exception e) {
			e.printStackTrace();
			resultado.setErrorConMensaje("Ocurrio un error inesperado :" + e.getMessage());
			logger.error("Ocurrio un error inesperado", e);
		}
		logger.info("######## enviarInformeAuditoria END ########");
		return resultado;
	}
	
	@Override
	public Resultado enviarInformeAuditoria(String mensaje) throws Exception {
		String moduloId = ConfigUtil.getInstance().get("MODULO_ID");
		String fecha = StringUtil.formatDate(new Date(), ConfigUtil.getInstance().get("FORMATO_FECHA"));
		return enviarInformeAuditoria(moduloId, fecha, mensaje);
	}

	@Override
	public Resultado notificarVenta(Compra compra) {
		logger.info("######## notificarVenta START ########");
		Resultado resultado = new Resultado();
		try {
			
			// Obtengo configuracion de WS
			Configuracion configuracion = adminConfig.buscarPorTipo(CONF_WS);
			String endPoint = configuracion.getValor();
			
			// Cargo el namespace del WSDL
			QName qname = new QName("http://webservices/", "WSMonitoreoService");
			// NULL para ignorar el WSDL
			WSMonitoreoService service = new WSMonitoreoService(null, qname);
			WSMonitoreo port = service.getWSMonitoreoPort();
			BindingProvider bindingProvider = (BindingProvider) port;
			// Cargo el endpoint
			bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endPoint);

			// Obtengo el XML y lo envio
			String xml = XmlUtil.compra2Xml(compra);
			logger.info("Envio compra con XML: " + xml);
			String result = port.registrarVenta(xml);
			logger.info("Recibo respuesta: " + result);
			resultado = XmlUtil.responseXml2Resultado(result);
			
		} catch (IllegalXMLException_Exception e) {
			e.printStackTrace();
			resultado.setErrorConMensaje("Ocurrio un error inesperado : Logistica y Monitoreo no respondio.");
			logger.error(resultado.getMensaje(), e);
		} catch (Exception e) {
			e.printStackTrace();
			resultado.setErrorConMensaje("Ocurrio un error inesperado :" + e.getMessage());
			logger.error("Ocurrio un error inesperado", e);
		}
		logger.info("######## notificarVenta END ########");
		return resultado;
	}

}